home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 16 / CU Amiga Magazine's Super CD-ROM 16 (1997-10-16)(EMAP Images)(GB)[!][issue 1997-11].iso / CUCD / Graphics / Ghostscript / source / gxfarith.h < prev    next >
C/C++ Source or Header  |  1996-12-13  |  4KB  |  130 lines

  1. /* Copyright (C) 1993, 1995 Aladdin Enterprises.  All rights reserved.
  2.   
  3.   This file is part of Aladdin Ghostscript.
  4.   
  5.   Aladdin Ghostscript is distributed with NO WARRANTY OF ANY KIND.  No author
  6.   or distributor accepts any responsibility for the consequences of using it,
  7.   or for whether it serves any particular purpose or works at all, unless he
  8.   or she says so in writing.  Refer to the Aladdin Ghostscript Free Public
  9.   License (the "License") for full details.
  10.   
  11.   Every copy of Aladdin Ghostscript must include a copy of the License,
  12.   normally in a plain ASCII text file named PUBLIC.  The License grants you
  13.   the right to copy, modify and redistribute Aladdin Ghostscript, but only
  14.   under certain conditions described in the License.  Among other things, the
  15.   License requires that the copyright notice and this notice be preserved on
  16.   all copies.
  17. */
  18.  
  19. /* gxfarith.h */
  20. /* Floating point arithmetic macros for Ghostscript library */
  21. #include "gconfigv.h"        /* for USE_FPU */
  22. #include "gxarith.h"
  23.  
  24. /*
  25.  * The following macros replace the ones in gxarith.h on machines
  26.  * that are likely to have very slow floating point.
  27.  *
  28.  * None of these macros would be necessary if compilers had a clue
  29.  * about generating good floating point comparisons on machines with
  30.  * slow (or no) floating point hardware.
  31.  */
  32.  
  33. # if USE_FPU <= 0 && arch_floats_are_IEEE && (arch_sizeof_float == arch_sizeof_int || arch_sizeof_float == arch_sizeof_long)
  34.  
  35. #  if arch_sizeof_float == arch_sizeof_int
  36. typedef int _f_int_t;
  37. typedef uint _f_uint_t;
  38. #  else        /* arch_sizeof_float == arch_sizeof_long */
  39. typedef long _f_int_t;
  40. typedef ulong _f_uint_t;
  41. #  endif
  42. #  define _f_as_int(f) *(_f_int_t *)(&(f))
  43. #  define _f_as_uint(f) *(_f_uint_t *)(&(f))
  44.  
  45. #  if arch_sizeof_double == arch_sizeof_int
  46. #    define _d_int_t int
  47. #  else
  48. #   if arch_sizeof_double == arch_sizeof_long
  49. #    define _d_int_t long
  50. #   endif
  51. #  endif
  52. #  define _d_uint_t unsigned _d_int_t
  53. #  define _d_as_int(f) *(_d_int_t *)(&(d))
  54. #  define _d_as_uint(f) *(_d_uint_t *)(&(d))
  55.  
  56. #  define _ftest(v,f,n)\
  57.      (sizeof(v)==sizeof(float)?(f):(n))
  58. #  ifdef _d_int_t
  59. #    define _fdtest(v,f,d,n)\
  60.     (sizeof(v)==sizeof(float)?(f):sizeof(v)==sizeof(double)?(d):(n))
  61. #  else
  62. #    define _fdtest(v,f,d,n)\
  63.     _ftest(v,f,n)
  64. #  endif
  65.  
  66. #  undef is_fzero
  67. #  define is_fzero(f)    /* must handle both +0 and -0 */\
  68.      _fdtest(f, (_f_as_int(f) << 1) == 0, (_d_as_int(f) << 1) == 0,\
  69.        (f) == 0.0)
  70.  
  71. #  undef is_fzero2
  72. #  define is_fzero2(f1,f2)\
  73.      (sizeof(f1) == sizeof(float) && sizeof(f2) == sizeof(float) ?\
  74.       ((_f_as_int(f1) | _f_as_int(f2)) << 1) == 0 :\
  75.       (f1) == 0.0 && (f2) == 0.0)
  76.  
  77. #  undef is_fneg
  78. #  if arch_is_big_endian
  79. #    define _is_fnegb(f) (*(byte *)&(f) >= 0x80)
  80. #  else
  81. #    define _is_fnegb(f) (((byte *)&(f))[sizeof(f) - 1] >= 0x80)
  82. #  endif
  83. #  if arch_sizeof_float == arch_sizeof_int
  84. #    define is_fneg(f)\
  85.        (sizeof(f) == sizeof(float) ? _f_as_int(f) < 0 :\
  86.     _is_fnegb(f))
  87. #  else
  88. #    define is_fneg(f) _is_fnegb(f)
  89. #  endif
  90.  
  91. #  define IEEE_expt 0x7f800000    /* IEEE exponent mask */
  92. #  define IEEE_f1 0x3f800000    /* IEEE 1.0 */
  93.  
  94. #  undef is_fge1
  95. #  if arch_sizeof_float == arch_sizeof_int
  96. #    define is_fge1(f)\
  97.        (sizeof(f) == sizeof(float) ?\
  98.     (_f_as_int(f)) >= IEEE_f1 :\
  99.     (f) >= 1.0)
  100. #  else            /* arch_sizeof_float == arch_sizeof_long */
  101. #    define is_fge1(f)\
  102.        (sizeof(f) == sizeof(float) ?\
  103.     (int)(_f_as_int(f) >> 16) >= (IEEE_f1 >> 16) :\
  104.     (f) >= 1.0)
  105. #  endif
  106.  
  107. #  undef f_fits_in_ubits
  108. #  undef f_fits_in_bits
  109. #  define _f_bits(n) (4.0 * (1L << ((n) - 2)))
  110. #  define f_fits_in_ubits(f, n)\
  111.     _ftest(f, _f_as_uint(f) < (_f_uint_t)IEEE_f1 + ((_f_uint_t)(n) << 23),\
  112.       (f) >= 0 && (f) < _f_bits(n))
  113. #  define f_fits_in_bits(f, n)\
  114.     _ftest(f, (_f_as_uint(f) & IEEE_expt) < IEEE_f1 + ((_f_uint_t)((n)-1) << 23),\
  115.       (f) >= -_f_bits((n)-1) && (f) < _f_bits((n)-1))
  116.  
  117. # endif                    /* USE_FPU <= 0 & ... */
  118.  
  119. /*
  120.  * Define sine and cosine functions that take angles in degrees rather than
  121.  * radians, hit exact values at multiples of 90 degrees, and are implemented
  122.  * efficiently on machines with slow (or no) floating point.
  123.  */
  124. double gs_sin_degrees(P1(double angle));
  125. double gs_cos_degrees(P1(double angle));
  126. typedef struct gs_sincos_s {
  127.   double sin, cos;
  128. } gs_sincos_t;
  129. void gs_sincos_degrees(P2(double angle, gs_sincos_t *psincos));
  130.